package cn.design;

import cn.design.realize.AbstractionMessageType;
import cn.design.realize.ImplementorMessageSendMode;
import cn.design.realize.impl.AbstractionClassOneMessageType;
import cn.design.realize.impl.AbstractionClassTwoMessageType;
import cn.design.realize.impl.AbstractionNormalMessageType;
import cn.design.realize.impl.ConcreteImplementorBBMachineMessageSendMode;
import cn.design.realize.impl.ConcreteImplementorEmailMessageSendMode;
import cn.design.realize.impl.ConcreteImplementorPhoneMessageSendMode;

/**
 * @author dlq
 * @description 桥接模式的客户端类
 * @date 2020/9/24 10:47
 * @since 1.0
 */
public class BridgeClientDemo {
    public static void main(String[] args) {
        //故事背景：
        // 我现在 有 三种消息类型 : 正常消息、一级消息、二级消息 ....更多
        // 我发消息的方式有三种， 手机发送、邮件发送、BB机发送
        // 我可以任意 "组合" 这里的"组合" 不是 "组合"模式中的组合,是连线意思
        // 即
        // 手机发送正常消息;
        // 手机发送一级消息;
        // 邮件发送二级消息;
        // BB机发送发送二级消息 等等

        //1.定义 发送消息内容和 接收消息用户
        String info = "写代码";
        String user = "老王" ;


        //2. 创建一个实现发送对象
        ImplementorMessageSendMode sendMode = new ConcreteImplementorPhoneMessageSendMode();
        //3.创建一个消息类型对象
        AbstractionMessageType messageType = new AbstractionNormalMessageType(sendMode);

        //4.实现发送消息

        // 手机发送正常消息;
        messageType.send(info,user);

        // 手机发送一级消息;
        messageType = new AbstractionClassOneMessageType(sendMode);
        messageType.send(info,user);

        // 邮件发送二级消息;
        sendMode = new ConcreteImplementorEmailMessageSendMode();
        messageType = new AbstractionClassTwoMessageType(sendMode);
        messageType.send(info,user);

        // BB机发送发送二级消息
        sendMode = new ConcreteImplementorBBMachineMessageSendMode();
        //这重新new 的原因是 上面 new xxx(sendMode) 的sendMode已经改变了
        messageType = new AbstractionClassTwoMessageType(sendMode);
        messageType.send(info,user);

    }
}
